package cn.hc.mq.transaction4;

import org.apache.rocketmq.client.producer.LocalTransactionState;
import org.apache.rocketmq.client.producer.TransactionListener;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;

import java.util.Objects;

/**
 * @author huangchao E-mail:fengquan8866@163.com
 * @version 创建时间：2024/9/19 20:37
 */
public class ICBCTransactionListener implements TransactionListener {
    // 回调操作
    // 消息预提交成功就会触发该方法的执行，用于完成本地事务
    @Override
    public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        System.out.println("预提交消息成功：" + msg);
        // 假设接收到Tag1的消息就表示扣款操作成功
        // Tag2的消息表示扣款失败
        // Tag3表示扣款结果不清楚，需要执行消息会查
        if (Objects.equals("Tag1", msg.getTags())) {
            return LocalTransactionState.COMMIT_MESSAGE;
        } else if (Objects.equals("Tag2", msg.getTags())) {
            return LocalTransactionState.ROLLBACK_MESSAGE;
        } else if (Objects.equals("Tag3", msg.getTags())) {
            return LocalTransactionState.UNKNOW;
        }
        return LocalTransactionState.UNKNOW;
    }

    // 消息回查方法
    // 引发消息回查的原因最常见的两个：
    //   1.回调操作返回UNKNOW
    //   2.TC没有接收到TM的最终全局事务确认指令
    @Override
    public LocalTransactionState checkLocalTransaction(MessageExt msg) {
        System.out.println("执行消息回查" + msg.getTags());
        return LocalTransactionState.COMMIT_MESSAGE;
    }
}
